package gov.pr.celepar.sentinela.admin.action.restricao;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import gov.pr.celepar.framework.util.Pagina;
import gov.pr.celepar.sentinela.admin.action.SentinelaAction;
import gov.pr.celepar.sentinela.admin.excecao.SentinelaServerException;
import gov.pr.celepar.sentinela.admin.facade.RestricaoIPFacade;
import gov.pr.celepar.sentinela.admin.facade.SistemaFacade;
import gov.pr.celepar.sentinela.admin.form.restricao.RestricaoIPGrupoForm;
import gov.pr.celepar.sentinela.admin.pojo.Grupo;
import gov.pr.celepar.sentinela.admin.pojo.RestricaoIP;
import gov.pr.celepar.sentinela.admin.pojo.RestricaoIPGrupoSistema;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RestricaoIPGrupoAction extends SentinelaAction {

	public ActionForward iniciar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {

		setActionForward(mapping.findForward("lista_restricoes_ip_grupo"));
		this.listarSistemasAutorizados(request);

		return getActionForward();
	}

	public ActionForward pesquisar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("lista_restricoes_ip_grupo"));
		this.listarSistemasAutorizados(request);

		Long codSistema = ipForm.getCodSistema() != null
				&& !ipForm.getCodSistema().equals("") ? Long.decode(ipForm
				.getCodSistema()) : null;

		Collection<RestricaoIP> restricoes = RestricaoIPFacade
				.getRestricoesIPGrupo(codSistema);

		if (restricoes != null && !restricoes.isEmpty()) {
			int size = restricoes.size();
			Pagina pagina = new Pagina(size, 1, size);
			pagina.setRegistros(restricoes);

			request.setAttribute("pagina", pagina);
		} else {
			throw new SentinelaServerException("Nenhuma restrição encontrada! ");
		}

		return getActionForward();
	}

	public ActionForward alterar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("edit_restricao_ip_grupo"));
		this.listarSistemasAutorizados(request);

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Long codSistema = ipForm.getCodSistema() != null ? Long.decode(ipForm
				.getCodSistema()) : null;
		Long codRestricao = ipForm.getCodRestricao() != null ? Long
				.decode(ipForm.getCodRestricao()) : null;

		request.setAttribute("listaGruposSistema", SistemaFacade
				.listarGruposVinculados(codSistema, new Long(this.comunicacao
						.getCodUsuario()), codGruposCom));

		if (codSistema != null && codRestricao != null) {
			RestricaoIPGrupoSistema restricaoIPGrupo = new RestricaoIPGrupoSistema();
			restricaoIPGrupo.setCodRestricao(codRestricao);
			restricaoIPGrupo.setEnderecoIP(ipForm.getIPFormatado());
			restricaoIPGrupo.setAtiva(new Boolean(ipForm.isAtiva()));
			restricaoIPGrupo.setCodSistema(codSistema);

			if (ipForm.getCodGrupo() != null) {
				String[] codGrupos = ipForm.getCodGrupo();
				List<Grupo> grupos = new ArrayList<Grupo>();
				for (int i = 0; i < codGrupos.length; i++) {
					Long codGrupo = Long.decode(codGrupos[i]);
					Grupo grupo = new Grupo();
					grupo.setCodGrupo(codGrupo);
					grupos.add(grupo);
				}
				restricaoIPGrupo.setGrupos(grupos);
			}

			RestricaoIPFacade.alterar(restricaoIPGrupo);

			this.addMessageSucess("Restrição por IP alterada com sucesso!",
					request);

		}
		return getActionForward();
	}

	public ActionForward exibir(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("view_restricao_ip_grupo"));
		this.listarSistemasAutorizados(request);

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Long codSistema = ipForm.getCodSistema() != null ? Long.decode(ipForm
				.getCodSistema()) : null;
		Long codRestricao = ipForm.getCodRestricao() != null ? Long
				.decode(ipForm.getCodRestricao()) : null;

		if (codSistema != null && codRestricao != null) {
			RestricaoIPGrupoSistema restricaoIPGrupo = RestricaoIPFacade
					.getRestricaoIPGrupo(codRestricao, codSistema);
			if (restricaoIPGrupo != null) {
				ipForm.setAtiva(restricaoIPGrupo.getAtiva().booleanValue());
				ipForm.setEnderecoIP(restricaoIPGrupo.getEnderecoIP());
				ipForm.setNomeSistema(restricaoIPGrupo.getNomeSistema());

				String[] codGrupos = new String[restricaoIPGrupo.getGrupos()
						.size()];
				int i = 0;
				for (Grupo grupo : restricaoIPGrupo.getGrupos()) {
					codGrupos[i] = grupo.getCodGrupo().toString();
					i++;
				}
				ipForm.setCodGrupo(codGrupos);

				request.setAttribute("listaGruposSistema",
						SistemaFacade.listarGruposVinculados(codSistema,
								new Long(this.comunicacao.getCodUsuario()),
								codGruposCom));
			}
		}

		return getActionForward();
	}

	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("edit_restricao_ip_grupo"));
		this.listarSistemasAutorizados(request);

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Long codSistema = ipForm.getCodSistema() != null ? Long.decode(ipForm
				.getCodSistema()) : null;
		Long codRestricao = ipForm.getCodRestricao() != null ? Long
				.decode(ipForm.getCodRestricao()) : null;

		if (codSistema != null && codRestricao != null) {
			RestricaoIPGrupoSistema restricaoIPGrupo = RestricaoIPFacade
					.getRestricaoIPGrupo(codRestricao, codSistema);
			if (restricaoIPGrupo != null) {
				ipForm.setAtiva(restricaoIPGrupo.getAtiva().booleanValue());
				ipForm.setEnderecoIP(restricaoIPGrupo.getEnderecoIP());
				ipForm.setNomeSistema(restricaoIPGrupo.getNomeSistema());

				String[] codGrupos = new String[restricaoIPGrupo.getGrupos()
						.size()];
				int i = 0;
				for (Grupo grupo : restricaoIPGrupo.getGrupos()) {
					codGrupos[i] = grupo.getCodGrupo().toString();
					i++;
				}
				ipForm.setCodGrupo(codGrupos);

			}
		}
		request.setAttribute("listaGruposSistema", SistemaFacade
				.listarGruposVinculados(codSistema, new Long(this.comunicacao
						.getCodUsuario()), codGruposCom));

		return getActionForward();
	}

	public ActionForward excluir(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("view_restricao_ip_grupo"));
		this.listarSistemasAutorizados(request);

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Long codSistema = ipForm.getCodSistema() != null ? Long.decode(ipForm
				.getCodSistema()) : null;
		Long codRestricao = ipForm.getCodRestricao() != null ? Long
				.decode(ipForm.getCodRestricao()) : null;
		if (codSistema != null && codRestricao != null) {
			RestricaoIPGrupoSistema restricaoIPGrupo = new RestricaoIPGrupoSistema();
			restricaoIPGrupo.setCodRestricao(codRestricao);
			restricaoIPGrupo.setEnderecoIP(ipForm.getIPFormatado());
			restricaoIPGrupo.setAtiva(new Boolean(ipForm.isAtiva()));
			restricaoIPGrupo.setCodSistema(codSistema);

			try {
				RestricaoIPFacade.excluir(restricaoIPGrupo);
			} catch (Exception e) {
				request.setAttribute("listaGruposSistema",
						SistemaFacade.listarGruposVinculados(codSistema,
								new Long(this.comunicacao.getCodUsuario()),
								codGruposCom));
				throw e;
			}

			this.addMessageSucess("Restrição por IP removida com sucesso!",
					request);

			Collection<RestricaoIP> restricoes = RestricaoIPFacade
					.getRestricoesIPGrupo(codSistema);
			setActionForward(mapping.findForward("lista_restricoes_ip_grupo"));
			if (restricoes != null && !restricoes.isEmpty()) {
				int size = restricoes.size();
				Pagina pagina = new Pagina(size, 1, size);
				pagina.setRegistros(restricoes);

				request.setAttribute("pagina", pagina);
			} else {
				throw new SentinelaServerException(
						"Nenhuma restri��o encontrada! ");
			}

		}
		return getActionForward();
	}

	public ActionForward incluir(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		RestricaoIPGrupoForm ipForm = (RestricaoIPGrupoForm) form;
		setActionForward(mapping.findForward("edit_restricao_ip_grupo"));
		this.listarSistemasAutorizados(request);

		long[] gruposCom = this.comunicacao.getIdGrupos();
		Long codGruposCom[] = null;
		if (gruposCom != null) {
			codGruposCom = new Long[gruposCom.length];
			for (int i = 0; i < gruposCom.length; i++)
				codGruposCom[i] = Long.valueOf(gruposCom[i]);
		}

		Long codSistema = ipForm.getCodSistema() != null ? Long.decode(ipForm
				.getCodSistema()) : null;
		if (codSistema != null && ipForm.getCodGrupo() != null) {
			String enderecoIP = ipForm.getIPFormatado();
			RestricaoIPGrupoSistema restricaoIPGrupo = new RestricaoIPGrupoSistema();
			restricaoIPGrupo.setCodSistema(codSistema);
			restricaoIPGrupo.setAtiva(true);
			restricaoIPGrupo.setEnderecoIP(enderecoIP);

			String[] codGrupos = ipForm.getCodGrupo();
			List<Grupo> grupos = new ArrayList<Grupo>();
			for (int i = 0; i < codGrupos.length; i++) {
				Long codGrupo = Long.decode(codGrupos[i]);
				Grupo grupo = new Grupo();
				grupo.setCodGrupo(codGrupo);
				grupos.add(grupo);
			}
			restricaoIPGrupo.setGrupos(grupos);

			try {
				RestricaoIPFacade.salvar(restricaoIPGrupo);
			} catch (Exception e) {
				request.setAttribute("listaGruposSistema",
						SistemaFacade.listarGruposVinculados(codSistema,
								new Long(this.comunicacao.getCodUsuario()),
								codGruposCom));
				throw e;
			}

			this
					.addMessageSucess(
							"Restriçào por IP cadastrada com sucesso para o Grupo no Sistema!",
							request);

			Collection<RestricaoIP> restricoes = RestricaoIPFacade
					.getRestricoesIPGrupo(codSistema);
			int size = restricoes.size();
			Pagina pagina = new Pagina(size, 1, size);
			pagina.setRegistros(restricoes);

			request.setAttribute("pagina", pagina);
			setActionForward(mapping.findForward("lista_restricoes_ip_grupo"));
		}

		return getActionForward();
	}
}
